
import 'dart:io';
import 'dart:isolate';
import 'package:excel/excel.dart' as top_excel;

// 提取需要合并的数据
extractData(Map<String, dynamic> extractMap) async {
  SendPort sendPort = extractMap["sendPort"];
  List<File> childFiles = extractMap["data"];
  List<String> sheetNames = extractMap["sheetName"].split("、");
  String sheetName = "";
  // 提取之后的数据
  List<List<dynamic>> originDataTemp = [];
  dynamic result = {};
  childFiles.forEach((file) async {
    // 提取每个数据
    top_excel.Excel excel = top_excel.Excel.decodeBytes(file.readAsBytesSync());
    // 判断 sheetName 是否存在
    for (var sheetNameTemp in sheetNames) {
      var table = excel.tables[sheetNameTemp];
      if (table != null) {
        sheetName = sheetNameTemp;
        break;
      }
    }
    final sheetCms = excel.tables[sheetName];
    // 获取时间的数据
    List<top_excel.Data?>? cellA1 = sheetCms?.row(0);
    String dateA1 = "";
    if (cellA1 != null) {
      // var cellValue = cellA1[0]?.value;
      // var a1 = cellA1[0]?.value.toString().substring(cellValue.toString().indexOf(":") + 1, cellValue.toString().length).trim();
      // // 改为取这个文件的日期
      // // 获取这个文件名
      // var i = file.path.lastIndexOf("\\") + 1;
      // var date = convertDateFormat(a1.toString());
      // 获取文件名
      var i = file.path.lastIndexOf("\\") + 1;
      var fileName = file.path.substring(i, file.path.length);
      // 获取文件名的后8位数字作为日期，把文件后缀去掉
      fileName = fileName.replaceAll(".xlsx", "").trim().toString();
      // 获取日期
      var date = fileName.substring(fileName.length - 8, fileName.length);
      // 转换日期格式 20240101 -> 2024-01-01，在年月日中间加入-
      date = convertDateFormat(date);
      // 读取文件
      dateA1 = date;
    }

    // final sheetCms = excel.sheets["${sheetName}"];
    if (sheetCms == null) {
      result = {"code": 1, "msg": " 在$file 文件中没有找到$sheetName表，请检查", "data": []};
      sendPort.send(result);
      return;
    }
    // 找到这几个列对应的索引
    // ACTUAL INSTALL DATE  、  DELIVERY_DATE   、 DELIVERY_TIMECAT  、 COURIER_NAME
    int actualInstallDateIndex = -1;
    int deliveryDateIndex = -1;
    int deliveryTimecatIndex = -1;
    int courierNameIndex = -1;
    for (int i = 0; i < sheetCms.rows.length; i++) {
      var row = sheetCms.rows[i];
      for (int j = 0; j < row.length; j++) {
        if (row[j] != null) {
          var cellValue = row[j]!.value;
          if (cellValue != null && cellValue.toString().contains("ACTUAL INSTALL DATE")) {
            actualInstallDateIndex = j;
          }
          if (cellValue != null && cellValue.toString().contains("DELIVERY_DATE")) {
            deliveryDateIndex = j;
          }
          if (cellValue != null && cellValue.toString().contains("DELIVERY_TIMECAT")) {
            deliveryTimecatIndex = j;
          }
          if (cellValue != null && cellValue.toString().contains("COURIER_NAME")) {
            courierNameIndex = j;
          }
        }
        if (actualInstallDateIndex != -1 && deliveryDateIndex != -1 && deliveryTimecatIndex != -1 && courierNameIndex != -1) {
          break;
        }
      }
    }
    // 读取数据，从第二行开始读取数据
    List<List<top_excel.Data?>> rows = sheetCms.rows;
    // 当前表的数量
    var i = file.path.lastIndexOf("\\") + 1;
    var fileName = file.path.substring(i, file.path.length);
    sendPort.send({"code": 3, "msg": "正在解析$fileName 文件中$sheetName表，数据数量为${rows.length - 2}"});
    for (var i = 2; i < rows.length; i++) {
      var row = rows[i];
      List<dynamic> valueRow = [];
      valueRow.add(dateA1);
      for (int i1 = 0; i1 < row.length; i1++) {
        if (i1 == deliveryDateIndex || i1 == actualInstallDateIndex || i1 == deliveryTimecatIndex || i1 == courierNameIndex) {
          // 这两条数据不添加进去
        } else {
          valueRow.add(row[i1]?.value ?? "\t\t");
        }
      }
      originDataTemp.add(valueRow);
    }
  });
  // 全部添加完成之后，在指定的位置添加两列空白数据，额外处理
  originDataTemp.forEach((element) {
    element.insert(4, "0");
    element.insert(5, "0");
  });
  originDataTemp.forEach((element) {
    print("需要处理的数据： ${element}");
  });
  result = {"code": 0, "msg": "解析成功", "data": originDataTemp};
  sendPort.send(result);
}

// 进行数据合并
mergeData(Map<String, dynamic> margeMap) async {
  bool isNullHeader = margeMap["isNullHeader"]; // 是否存在表头
  SendPort sendPort = margeMap["sendPort"]; // 端口
  File mainFile = margeMap["mainFile"]; // 主文件
  List<List<dynamic>> originData = margeMap["originData"]; // 需要合并的数据
  String sheetName = margeMap["sheetName"]; // sheet名称  默认是 Main 表名

  // 打开要合并的文件
  late top_excel.Excel excelMain;
  // try {
  var readAsBytesSync = mainFile.readAsBytesSync();
  excelMain = top_excel.Excel.decodeBytes(readAsBytesSync);
  // } catch (e) {
  //   sendPort.send({"code": 1, "msg": "读取失败，异常是 ${e.toString()}"});
  //   print(e);
  //   return;
  // }
  // 读取主文件
  var cmsMainSheet = excelMain.sheets[sheetName];
  if (cmsMainSheet == null) {
    sendPort.send({"code": 1, "msg": "没有找到$sheetName表"});
    return;
  }
  // 开始写入数据，在原来的文件中，在最后一行开始写入
  originData.asMap().forEach((index, value) {
    List<top_excel.CellValue> list = [];
    value.forEach((childValue) {
      // 文本
      var textCellValue = top_excel.TextCellValue(childValue.toString());
      // topExcel.CellValue cellValue = textCellValue;
      list.add(textCellValue);
    });

    // 判断是否空表头
    if (isNullHeader) {
      isNullHeader = !isNullHeader;
      cmsMainSheet.insertRow(0);
      cmsMainSheet.insertRow(1);
      cmsMainSheet.insertRow(2);
    }
    cmsMainSheet.appendRow(list);
    int lastRowIndex = cmsMainSheet.maxRows - 1;
    // 为新添加的行设置边框
    top_excel.Border border = top_excel.Border(borderStyle: top_excel.BorderStyle.Thin, borderColorHex: top_excel.ExcelColor.black);
    top_excel.CellStyle cellStyle = top_excel.CellStyle(fontSize: 22, fontColorHex: top_excel.ExcelColor.green, topBorder: border, bottomBorder: border, leftBorder: border, rightBorder: border);
    for (int i = 0; i < (cmsMainSheet.rows[lastRowIndex].length); i++) {
      // 设置新增的单元格样式，包括边框和字体颜色
      cmsMainSheet.rows[lastRowIndex][i]?.cellStyle = cellStyle;
    }
    for (var cell in cmsMainSheet.rows[lastRowIndex]) {
      cell?.cellStyle = cellStyle;
    }

    // 更新一下UI 界面进度
    sendPort.send({"code": 2, "msg": "正在写入数据，请稍后... 当前处理的是第 ${index + 1} 行，一共 ${originData.length} 行", "value": (index + 1) / originData.length});
  });
  // 写入之后进行保存到他本身
  final bytes = excelMain.encode();
  dynamic result = {};
  try {
    sendPort.send({"code": 2, "msg": "正在写入到文件中，请稍后..."});
    mainFile.writeAsBytesSync(bytes!);
    result = {"code": 0, "msg": "写入成功"};
  } catch (e) {
    print(e.toString());
    if (e is PathAccessException) {
      result = {"code": 1, "msg": "文件被占用"};
    }
  }
  sendPort.send(result);
}

String convertDateFormat(String dateStr) {
  DateTime dateTime = DateTime.parse(dateStr);
  var day = dateTime.day.toString().length == 1 ? "0${dateTime.day}" : dateTime.day; // 日期（天）
  var month = (dateTime.month).toString().length == 1 ? "0${dateTime.month}" : dateTime.month; // 月份
  var year = dateTime.year; // 年
  var formattedDate = "$year-$month-$day"; // 此处月份和日期如果小于10则填充0
  return formattedDate; // 返回格式化后的日期和时间
}